Хорошо! Хорошо!:  0
Плохо! Плохо!:  0
Показано с 1 по 2 из 2

Тема: [MV + MZ] JsonWorker

  1. #1
    Бывалый Аватар для Darchan Kaen
    Информация о пользователе
    Регистрация
    17.06.2013
    Адрес
    Одесса
    Сообщений
    851
    Записей в дневнике
    3
    Репутация: 47 Добавить или отнять репутацию

    По умолчанию [MV + MZ] JsonWorker

    Название плагина: DKR_JsonWorker

    Автор: DarchanKaen

    Версия: 1.0

    Дата выхода: Версия 1.0 - 28.06.2021

    Описание плагина:
    Плагин позволяет работать с произвольными JSON-файлами, а именно:
    загружать (полностью / частично) данные файла в переменные мейкера, менять (полностью / частично) данные в файле и создавать новые JSON-файлы.
    Также для упрощения можно использовать Основной файл.

    Нюансы:
    0. Для корректной работы плагина в корне проекта, в котором он используется, нужно создать отдельную папку и указать ее в параметре плагина как каталог для файлов (опционально, можно создать файл с расширением .json и в параметрах плагина указать его как "Основной файл")!
    1. После операций загрузки("маппинга") / изменения / любых операций кроме создания файла - поставьте в мейкере команду Ждать на 15 кадров.
    Файловые совершаются не мгновенно.
    2. "Основной файл" не обязательно использовать - он для упрощения в случае, если нет нужды во многих JSON-файлах (например, у вас один файл "мета-сохраненя"); также Основной файл можно менять в процессе игры (см. Команды).
    3. В целях безопасности у плагина нет возможности удалять файлы!
    4. JSON-файлы не зависят от файлов сохранений, единственная зависимость у Основного файла - его название таки сохраняется в переменной, чтоб каждый раз вручную не указывать при загрузке.

    Использование плагина(одинаково и для MV , и для MZ):

    Параметры плагина
    В параметрах можно указать: каталог, где находятся JSON-файлы, номер переменной для хранения имени Основного файла и название Основного файла.

    Команды (в эвенте, в команде "Скрипт"):

    Управляющие команды:
    DKR.JsonWorker.setJSONDir('имя каталога\') - изменить каталог с JSON-файлы;
    DKR.JsonWorker.setMainFile('имяФайла.json' ) - изменить Основной файл;
    DKR.JsonWorker.clearMainFile() - очистить значение Основного файла чтоб его не использовать (физически файл не меняется!);
    DKR.JsonWorker.setMainFileDefaultVariableId(ном ерПеременной) - изменить номер переменно для хранения имени Основного файла;
    DKR.JsonWorker.isJSONFileExist('имяФайла.j son') - узнать, существует ли (возвращает true) или нет (возвращает false) указаный JSON-файл;

    Рабочие команды:
    - Чтение произвольного JSON-файла(просто выводит в консоль содержимое файла, для теста):
    DKR.JsonWorker.readJson('имяФайла.json'); - читаем файл и выводит его в консоль.
    - Загрузка ("маппинг") данных произвольного JSON-файла на переменные мейкера:
    DKR.JsonWorker.simpleMapJSON('имяФайла.jso n', номерПеременной); - присваивает указанной переменной все содержимое JSON-файла.
    DKR.JsonWorker.concreteMapJSON('имяФайла.j son',['ключЗаписи1', ..., 'ключЗаписиN'], [номерПеременной1, ..., номерПеременнойN]); - присваивает указанным переменным содержимое данных по указанным ключам.
    DKR.JsonWorker.fullMapJSON ('имяФайла.json', [номерПеременной1, ..., номерПеременнойN]); - присваивает указанным переменным все данные по всем ключам.
    - Создание произвольного JSON-файла:
    DKR.JsonWorker.simpleWriteJSON('имяФайла.j son', данныеДляЗаписи, ключЗаписи(можно не указывать и тогда оно 'customData') ); - создает файл с указанными данными под указанным ключом (1 ключ).
    DKR.JsonWorker.fullWriteJSON('имяФайла.jso n', [данныеДляЗаписи1, ...,данныеДляЗаписиN], [ключЗаписи1, ...,ключЗаписиN]); - создает файл с указанными данными под указанными ключами (несколько ключей и данных).
    - Изменение данных произвольного JSON-файла:
    DKR.JsonWorker.simpleModifyJSON('имяФайла. json', ключЗаписи, данныеДляЗаписи); - меняет в указанном файле данные под указанным ключом (1 ключ).
    DKR.JsonWorker.fullModifyJSON ('имяФайла.json', [ключЗаписи1, ...,ключЗаписиN], [данныеДляЗаписи1, ...,данныеДляЗаписиN]); - меняет в указанном файле данные под указанными ключами (несколько ключей и данных).
    - Команды для Основного файла (по аналогии с вышеуказанным):
    DKR.JsonWorker.readMainFile();
    DKR.JsonWorker.simpleMapMainFile(номерПер менной);
    DKR.JsonWorker.concreteMapMainFile(['ключЗаписи1', ..., 'ключЗаписиN'], [номерПеременной1, ..., номерПеременнойN]);
    DKR.JsonWorker.fullMapMainFile([номерПеременной1, ..., номерПеременнойN]);
    DKR.JsonWorker.simpleModifyMainFile(ключЗап иси, данныеДляЗаписи);
    DKR.JsonWorker.fullModifyMainFile([ключЗаписи1, ...,ключЗаписиN], [данныеДляЗаписи1, ...,данныеДляЗаписиN]);

    Код:
    Спойлер Код плагина, версия 1.0:

    Код:
    /*:
     *-----------------------------------------------------------------------------
     *  DKR JsonWorker
     *-----------------------------------------------------------------------------
     *  For: RPGMAKER MV, MZ
     *  DKR_JsonWorker_MV_MZ.js
     *-----------------------------------------------------------------------------
     *  28.06.2021 - Версия 1.0.0
     *-----------------------------------------------------------------------------
     * Поставляется AS-IS.
     * Вся ответственность при использовании - на Пользователе!
     *-----------------------------------------------------------------------------
     *-----------------------------------------------------------------------------
     * @author DarchanKaen
     * @target MV, MZ
     * @plugindesc (v.1.0.0)  Плагин позволяет работать с произвольными JSON-файлами (загружать / менять / создавать).
     * @help
     *   DKR JsonWorker MV_MZ 1.0
     * ----------------------------------------------------------------------------
     * ----Общая информация:
     * Плагин позволяет работать с произвольными JSON-файлами, а именно: 
     * загружать (полностью / частично) данные фйла в переменные мейкера,
     * менять (полностью / частично) данные в файле и создавать новые JSON-файлы. 
     * Также для упрощения можно использовать Основной файл.
     * После операций загрузки ("маппинга") / изменения ставьте Ждать на ~15 кадров!!!
     * ! Детали в демо и на сайте https://rpgmaker.su/ в разделе Плагинов !
     * ----Использование:
     * ---Параметры плагина
     * В параметрах можно указать: каталог, где находятся JSON-файлы, 
     * номер переменной для хранения имени Основного файла и название Основного файла.
     * ---Команды (для раздела "Скрипт"):
     * --Управляющие команды:
     * DKR.JsonWorker.setJSONDir('имя каталога\') - изменить каталог с JSON-файлы;
     * DKR.JsonWorker.setMainFile('имяФайла.json') - изменить Основной файл;
     * DKR.JsonWorker.clearMainFile() - очистить значение Основного файла чтоб его не использовать (физически файл не меняется!);
     * DKR.JsonWorker.setMainFileDefaultVariableId(номерПеременной) - изменить номер переменно для хранения имени Основного файла;
     * DKR.JsonWorker.isJSONFileExist('имяФайла.json') - узнать, существует ли (возвращает true) или нет (возвращает false) указаный JSON-файл;
     * --Рабочие команды:
     * - Чтение произвольного JSON-файла(просто выводит в консоль содержимое файла, для теста):
     * DKR.JsonWorker.readJson('имяФайла.json');
     * - Загрузка ("маппинг") данных произвольного JSON-файла на переменные мейкера:
     * DKR.JsonWorker.simpleMapJSON('имяФайла.json', номерПеременной);
     * DKR.JsonWorker.concreteMapJSON('имяФайла.json',['ключЗаписи1', ..., 'ключЗаписиN'], [номерПеременной1, ..., номерПеременнойN]);
     * DKR.JsonWorker.fullMapJSON ('имяФайла.json', [номерПеременной1, ..., номерПеременнойN]); 
     * - Создание произвольного JSON-файла:
     * DKR.JsonWorker.simpleWriteJSON('имяФайла.json', данныеДляЗаписи, ключЗаписи(можно не указывать));
     * DKR.JsonWorker.fullWriteJSON('имяФайла.json', [данныеДляЗаписи1, ...,данныеДляЗаписиN], [ключЗаписи1, ...,ключЗаписиN]);
     * - Изменение данных произвольного JSON-файла:
     * DKR.JsonWorker.simpleModifyJSON('имяФайла.json', ключЗаписи, данныеДляЗаписи);
     * DKR.JsonWorker.fullModifyJSON ('имяФайла.json', [ключЗаписи1, ...,ключЗаписиN], [данныеДляЗаписи1, ...,данныеДляЗаписиN]);
     * - Команды для Основного файла (по аналогии с вышеуказанным):
     * DKR.JsonWorker.readMainFile();
     * DKR.JsonWorker.simpleMapMainFile(номерПеременной);
     * DKR.JsonWorker.concreteMapMainFile(['ключЗаписи1', ..., 'ключЗаписиN'], [номерПеременной1, ..., номерПеременнойN]);
     * DKR.JsonWorker.fullMapMainFile([номерПеременной1, ..., номерПеременнойN]);
     * DKR.JsonWorker.simpleModifyMainFile(ключЗаписи, данныеДляЗаписи);
     * DKR.JsonWorker.fullModifyMainFile([ключЗаписи1, ...,ключЗаписиN], [данныеДляЗаписи1, ...,данныеДляЗаписиN]);
     * ----------------------------------------------------------------------------
     * ----Версия 1.0.0
     * --Релиз плагина!
     * ----------------------------------------------------------------------------
     * @param jsonDir
     * @type text
     * @desc Каталог, где находятся JSON-файлы.
     * @default metaJSON/
     *
     * @param mainFileNameDefVar
     * @type number
     * @desc Номер переменной, в которой сохраняется название Основгого файла.
     * @default 1
      *
     * @param mainFile
     * @type text
     * @desc Название Основного JSON-файла (он не обязателен).
     * @default mainFile.json
     */
     
     
    var Imported = Imported || {};
    Imported.DKR_JsonWorker = true;
    
    var DKR = DKR || {};          
    DKR.JsonWorker = DKR.JsonWorker || {}; 
    DKR.JsonWorker.version = 1.0;
    
    DKR.JsonWorker.parameters = PluginManager.parameters('DKR_JsonWorker_MV_MZ');
    
    
    ( () => {
    	
    		//---INNER VARIABLES
    	const fileSystem = require('fs');
    	const noneFile = 'NONE';
    	const customDataKey = 'customData';
    	
    	let jsonDir = DKR.JsonWorker.parameters['jsonDir'] || 'metaJSON/';
    	let mainFileNameDefVar = Number(DKR.JsonWorker.parameters[' mainFileNameDefVar']) || 1;
    	let mainFile = DKR.JsonWorker.parameters['mainFile'] || noneFile;
    	
    
    
    		//---INNER FUNCTIONS
    	//-open file
    	let openJson = function(jsonFileName, callbackTask){
    		let url = jsonDir + jsonFileName;
    		
    		if( false === fileSystem.existsSync(url) ){
    			console.log(`DKR.JsonWorker: file ${url} not exist!`);
    			return false;
    		}
    		
    		try{
    			let xhr = new XMLHttpRequest();
    			let jsonData  = -1;
    			
    			xhr.open('GET', url);
    			xhr.overrideMimeType('application/json');
    			xhr.onload = function() {
    				if (xhr.status < 400) {
    					jsonData = JSON.parse(xhr.responseText);
    						
    					callbackTask(jsonData);
    					return jsonData;
    				}
    			}
    			
    			xhr.send();
    		}catch(error){
    			console.log(`DKR.JsonWorker: unknown error on file ${url} opening!!!`);
    			console.log(error);
    			return false;
    		}
    		
    	}	
    	
    	//-create file
    	let createJson = function(jsonFileName, data){
    		let url = jsonDir + jsonFileName;
    		let jsonData = JSON.stringify(data);
    		try{
    			fileSystem.writeFileSync(url, jsonData);
    		}catch(error){
    			console.log(`DKR.JsonWorker: unknown error on file ${url} writing!!!`);
    			console.log(error);
    			return false;
    		}
    				
    	}
    	
    	//-update Main file name
    	let updateMainFileFromVariable = function(){
    		if(noneFile === mainFile){
    			mainFile = $gameVariables.value(mainFileNameDefVar);
    			if(0 === mainFile){
    				mainFile = noneFile;
    			}
    		}
    	}
    	
    	
    
    		//---PUBLIC WORK FUNCTIONS
    	//--READ!
    	//-read...for test	
    	DKR.JsonWorker.readJson = function(jsonFileName){
    		const readTask = (data) => {
    			console.log(data);
    		};
    		
    		let jsonData = openJson(jsonFileName, readTask);
    	}
    	
    	//-map in one variable
    	DKR.JsonWorker.simpleMapJSON = function(jsonFileName, variableId){
    		const simpeMapTask = (jsonData) => {
    			$gameVariables.setValue(variableId, jsonData);
    		};
    		
    		let jsonData = openJson(jsonFileName, simpeMapTask);
    	}
    	
    	//-map in concrete variables one concrete values
    	DKR.JsonWorker.concreteMapJSON = function(jsonFileName, jsonKeysArr, variablesIdArr){
    		if(jsonKeysArr.length !== variablesIdArr.length){
    			console.log('DKR.JsonWorker.concreteMapJSON(): keys and variables quantity must be equal!');
    			return false;
    		}
    			
    		const concreteMapTask = (jsonData) => {
    			for(let n = 0; n < jsonKeysArr.length; n++){
    				$gameVariables.setValue(variablesIdArr[n], jsonData[ jsonKeysArr[n] ]);
    			}
    		};
    		
    		let jsonData = openJson(jsonFileName, concreteMapTask);
    	}
    	
    	//-map to many variables all values
    	DKR.JsonWorker.fullMapJSON = function(jsonFileName, variablesIdArr){
    		const fullMapTask = (jsonData) => {
    			let jsonDataValues = Object.values(jsonData);
    			
    			for(let n = 0; n < variablesIdArr.length; n++){
    				$gameVariables.setValue(variablesIdArr[n], jsonDataValues[n]);
    			}
    		};
    		
    		let jsonData = openJson(jsonFileName, fullMapTask);
    	}
    	
    	
    	//--WRITE!
    	//-write simple data
    	DKR.JsonWorker.simpleWriteJSON = function(jsonFileName, dataValue, dataKey = customDataKey){
    		const customDataObject = {};
    		customDataObject[dataKey] = dataValue;
    		
    		createJson(jsonFileName, customDataObject);
    	}
    		
    	//-write full data	
    	DKR.JsonWorker.fullWriteJSON = function(jsonFileName, dataValuesArr, dataKeysArr){
    		const customDataObject = {};
    		
    		if(dataKeysArr.length !== dataValuesArr.length){
    			console.log('DKR.JsonWorker.fullWriteJSON(): keys and values quantity must be equal!');
    			return false;
    		}
    		
    		for(let n = 0; n < dataKeysArr.length; n++){
    			customDataObject[ dataKeysArr[n] ] = dataValuesArr[n];
    		}
    		
    		createJson(jsonFileName, customDataObject);
    	}
    	
    
    	//--MODIFY!
    	//-simple modify
    	DKR.JsonWorker.simpleModifyJSON = function(jsonFileName, jsonKey, jsonValue){
    		const simpleModifyTask = (data) => {
    			data[jsonKey] = jsonValue;
    			createJson(jsonFileName, data);
    		};
    		
    		let jsonData = openJson(jsonFileName, simpleModifyTask);
    	}
    	
    	//-full modify
    	DKR.JsonWorker.fullModifyJSON = function(jsonFileName, jsonKeysArr, jsonValuesArr){
    		
    		if(jsonKeysArr.length !== jsonValuesArr.length){
    				console.log('DKR.JsonWorker.fullModifyJSON(): keys and values quantity must be equal!');
    				return false;
    		}
    			
    		const fullModifyTask = (data) => {
    			for(let n = 0; n < jsonKeysArr.length; n++){
    				data[ jsonKeysArr[n] ] = jsonValuesArr[n];
    			}
    			
    			createJson(jsonFileName, data);
    		};
    		
    		let jsonData = openJson(jsonFileName, fullModifyTask);
    	}
    	
    
    	//--MAIN FILE!
    	DKR.JsonWorker.readMainFile = function(){
    		DKR.JsonWorker.readJson(mainFile);
    	}
    	
    	DKR.JsonWorker.simpleMapMainFile = function(variableId){
    		updateMainFileFromVariable();
    		
    		if(noneFile === mainFile){
    			console.log('DKR.JsonWorker: main file not set!');
    			return false;
    		}
    		
    		DKR.JsonWorker.simpleMapJSON(mainFile, variableId);
    	}
    	
    	DKR.JsonWorker.concreteMapMainFile = function(jsonKeysArr, variablesIdArr){
    		updateMainFileFromVariable();
    		
    		if(noneFile === mainFile){
    			console.log('DKR.JsonWorker: main file not set!');
    			return false;
    		}
    		
    		DKR.JsonWorker.concreteMapJSON(mainFile, jsonKeysArr, variablesIdArr)
    	}
    	
    	DKR.JsonWorker.fullMapMainFile = function(variablesIdArr){
    		updateMainFileFromVariable();
    		
    		if(noneFile === mainFile){
    			console.log('DKR.JsonWorker: main file not set!');
    			return false;
    		}
    
    		DKR.JsonWorker.fullMapJSON(mainFile, variablesIdArr);
    	}
    
    	DKR.JsonWorker.simpleModifyMainFile = function(jsonKey, jsonValue){
    		updateMainFileFromVariable();
    		
    		if(noneFile === mainFile){
    			console.log('DKR.JsonWorker: main file not set!');
    			return false;
    		}
    		
    		
    		DKR.JsonWorker.simpleModifyJSON(mainFile, jsonKey, jsonValue);
    	}
    
    	DKR.JsonWorker.fullModifyMainFile = function(jsonKeysArr, jsonValuesArr){
    		updateMainFileFromVariable();
    		
    		if(noneFile === mainFile){
    			console.log('DKR.JsonWorker: main file not set!');
    			return false;
    		}
    		
    		
    		DKR.JsonWorker.fullModifyJSON(mainFile, jsonKeysArr, jsonValuesArr)
    	}
    
    
    
    		//---PUBLIC CONTROL FUNCTIONS	
    	//-set base dir
    	DKR.JsonWorker.setJSONDir = function(dir){
    		jsonDir = dir;
    	}
    	
    	//-set main file
    	DKR.JsonWorker.setMainFile = function(fileName){
    		mainFile = fileName;
    		$gameVariables.setValue( mainFileNameDefVar, mainFile);
    	}
    	
    	//-clear main file
    	DKR.JsonWorker.clearMainFile = function(){
    		mainFile = noneFile;
    		$gameVariables.setValue( mainFileNameDefVar, 0);	
    	}
    	
    	//-set main fail default variable id for standard save/load
    	DKR.JsonWorker.setMainFileDefaultVariableId = function(variableId){
    		if(variableId < 1){
    			console.log('DKR.JsonWorker: variable id must be greater than zero!');
    		}
    		
    		 mainFileNameDefVar = variableId;
    	}
    	
    	
    	//-ident is file exist
    	DKR.JsonWorker.isJSONFileExist = function(jsonFileName){
    		let url = jsonDir + jsonFileName;
    		
    		let isFileExist = fileSystem.existsSync(url);
    		
    		return isFileExist;
    	}
    	
    
    })();


    Загрузка:
    Спойлер Ссылки на загрузку версии 1.0 и Демо:


    Условия поставки плагина:
    Поставляется AS-IS.
    Вся ответственность при использовании - на Пользователе!
    !

    Плагин не влияет на работу остальных плагинов меню / боя / скилов / предметов (т.к. не меняет логику мейкера) и должен быть совместим с любыми другими плагинами. Тем не мене, 100% совместимость я гарантировать не могу.
    Если найдете критическую несовместимость - дайте знать.

    Спойлер Лирическое отступление:
    "Im back"(c) Пока потихоньку буду клепать/выкладывать плагины что нужны для моего проекта, потом уже править предыдущие.
    Подобный плагин есть, но (насколько я помню) в нем чуть меньше функция на "маппинг" переменных. Будет альтернатива
    Последний раз редактировалось Darchan Kaen; 28.06.2021 в 21:55. Причина: Детализировал описание команд скрипта

  2. #2
    Бывалый Аватар для Darchan Kaen
    Информация о пользователе
    Регистрация
    17.06.2013
    Адрес
    Одесса
    Сообщений
    851
    Записей в дневнике
    3
    Репутация: 47 Добавить или отнять репутацию

    По умолчанию

    Дополнительная информация:
    1.
    Спойлер Что можно сделать при помощи данного плагина:
    Вообще говоря, много чего связанного с данными.
    1. Загрузка текста диалогов и выбора из внешнего файла.
    2. Загрузка некоторых текстовых фрагментов (а-ля "Записка") из внешнего файла.
    4. Заметки игрока (появляющиеся по ходу игры), подобие Журнала квестов, подобие Ачивок (вернее, хранить их текст).
    5. Сохранение и загрузка состояния игры, не зависящего от стандартного файла сохранения...этакое "мета-сохранение".
    Что позволяет с большим комфортом сделать нечто вроде "Hello? Hell...o?" (не играли? поиграйте!)


    2.
    Полезная информация о формате JSON:
    https://ru.wikipedia.org/wiki/JSON

    3.
    Спойлер Пояснение Демки:
    В принципе, Демка отображает основные возможности плагина и самого "подхода" и использованием внешних файлов.
    Наиболее наглядно тут именно "мета-сохранение" кристалла.
    Для большей наглядности лучше перезапустите Демку несколько раз.
    В чем суть:
    0. Все JSON-файлы хранятся в папке \metaJson.
    1. Слева, у "Клоуна", все три вопроса и варианты ответов не прописаны в самом мейкере и берутся из файлов questionOne.json, questionTwo.json, questionThree.json
    2. Количество запусков Демки ("Агент" справа) считывается и записывается в "Основной файл" mainFile.json в начале Демки.
    3. Выбранный кристалл ("Демон" сверху) сохраняется в файл crystalsCommonData.json , а его параметры - в файл crystalA.json , crystalB.json , crystalC.json (в зависимости от выбранного кристалла) и при старте Демки оттуда считываются и обрабатываются в общем событии.

    Все эти файлы открываются и правятся, в том числе, обычным блокнотом.



    ...А теперь вопрос.
    Вопрос:
    В принципе, при помощи данного плагина и маленького черного шаманства можно (теоретически) сделать такую систему, при которой диалоги/выборы прописываются вне мейкера в каком-то редакторе, а потом импортируются и воспроизводятся.
    Спойлер Как-то так:



    Собственно - на ваш взгляд, нужно ли такое или в мейкере и так удобная система "диалого-строения"?
    Последний раз редактировалось Darchan Kaen; 28.06.2021 в 17:38. Причина: Добавил пояснение Демки

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
[MV + MZ] JsonWorker